/**
 * 读取本地文件
 * @param {Object} filePath 目标文件路径
 * @returns 目标文件的文本内容（plan text)
 */
export function read(filePath) {
	// filePath ==>   plus.io.PUBLIC_DOCUMENTS
	return new Promise(resolve => { //文件读写是一个异步请求 用promise包起来方便使用时的async+await
		plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => { //请求文件系统
				fs.root.getFile(plus.io.PUBLIC_DOCUMENTS +  filePath, {
					create: true //当文件不存在时创建
				}, fileEntry => {
					// console.log(fileEntry,'fileEntry对象')
					// console.log(fileEntry.fullPath, '创建的路径位置')
					fileEntry.file(function(file) {
						//new一个可以用来读取文件的对象fileReader
						let fileReader = new plus.io.FileReader() 
						fileReader.readAsText(file, 'utf-8') //读文件的格式
						fileReader.onerror = e => { //读文件失败
							console.log('获取文件失败', fileReader.error)
							uni.showToast({
								title: '获取文件失败,请重启应用',
								icon: 'none'
							})
						}
						//读取文件成功完成的回调函数
						fileReader.onload = e => {
							let txtData = e.target.result
							// console.log(txtData,'txtData  IO')
							resolve(txtData) //回调函数内的值想返回到函数外部  就用promise+resolve来返回出去
						}
					})
				}, error => {
					console.log('2新建获取文件失败', error)
					uni.showToast({
						title: '获取文件失败,请重启应用',
						icon: 'none'
					})
				})
			},
			e => {
				console.log('1请求文件系统失败', e.message)
				 uni.showToast({
					title: '获取文件失败,请重启应用',
					icon: 'none'
				})
			}
		)
	})
	
}

export function write(filePath, textContent) {
	//TODO：将文本数据写入到本地文件中
	// 请求本地文件系统对象
	return new Promise(resolve => {
		plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, fs => { //请求文件系统
			fs.root.getFile(plus.io.PUBLIC_DOCUMENTS + filePath, {
					create: true //当文件不存在时创建
				}, fileEntry => {
					fileEntry.file(file => {
						fileEntry.createWriter(writer => {
								plus.nativeUI.showWaiting('正在保存信息')
								writer.onerror = function() {
									//写文件失败
									console.log('4写入文件失败', writer.error.message)
									plus.nativeUI.closeWaiting()
									plus.nativeUI.toast("添加信息失败,请重新操作", {
										background: '#ffa38c',
									})
									return
								}
								writer.onsuccess = function() { //写文件成功
									plus.nativeUI.closeWaiting()
									// return uni.showToast({
									// 	title: '添加信息成功',
									// 	icon: 'none'
									// })
									resolve(true) //回调函数内的值想返回到函数外部  就用promise+resolve来返回出去
								}
								writer.write(textContent)
							},
							error => {
								console.log('3创建creactWriter失败', error)
								plus.nativeUI.toast("保存文件失败,请重新操作", {
									background: '#ffa38c',
								})
								return
							})
					})
				},
				error => {
					console.log('2获取文件失败', error)
					plus.nativeUI.toast("保存文件失败,请重新操作", {
						background: '#ffa38c',
					})
					return
				}
			)
		}, e => {
			console.log('1请求文件系统失败', e.message)
			plus.nativeUI.toast("请求系统失败,请重新操作", {
				background: '#ffa38c',
			})
			return
		})
	})
}

function fnDefautlAppendTo(target={}){
	return target.result
}

/**
 * 往目标文件中添加数组元素
 * @param {Object} filePath 目标文件路径
 * @returns 添加完成后的JSON对象
 */
export async function append(filePath, ele={}, fnAppendTo=fnDefautlAppendTo) {
	const lastTextData = await read(filePath)
	console.log(lastTextData,'------121');
	const lastJsonData = JSON.parse(lastTextData)
	
	const appendTo = fnAppendTo==fnDefautlAppendTo
		? fnDefautlAppendTo(lastJsonData)
		: fnAppendTo(lastJsonData)
	if(!Array.isArray(appendTo)){
		throw new Error('指定添加数据的属性不是一个数组，请检查')
	}
	appendTo.push(ele)
	await write(filePath, JSON.stringify(lastJsonData))
	return lastJsonData
}

